package cn.always.xiajia.framework.web.config;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@ConfigurationProperties(prefix = "xj.web")
@Validated
@Data
public class WebProperties {

	@NotNull(message = "APP API 不能为空")
	private Api appApi = new Api("/app-api", "**.controller.app**");
	@NotNull(message = "Admin API 不能为空")
	private Api adminApi = new Api("/pc-api", "**.controller.pc**");

	@NotNull(message = "Admin UI 不能为空")
	private Ui adminUi;

	@Data
	@AllArgsConstructor
	@NoArgsConstructor
	@Valid
	public static class Api {

		/**
		 * API 前缀，实现所有 Controller 提供的 RESTFul API 的统一前缀
		 *
		 *
		 * 意义：通过该前缀，避免 Swagger、Actuator 意外通过 Nginx 暴露出来给外部，带来安全性问题 这样，Nginx
		 * 只需要配置转发到 /api/* 的所有接口即可。
		 *
		 * @see YudaoWebAutoConfiguration#configurePathMatch(PathMatchConfigurer)
		 */
		@NotEmpty(message = "API 前缀不能为空")
		private String prefix;

		/**
		 * Controller 所在包的 Ant 路径规则
		 *
		 * 主要目的是，给该 Controller 设置指定的 {@link #prefix}
		 */
		@NotEmpty(message = "Controller 所在包不能为空")
		private String controller;

	}

	@Data
	@Valid
	public static class Ui {

		/**
		 * 访问地址
		 */
		private String url;

	}

}
